<?php

class registerActions extends Object{
    
    //objetos a serem carregados
    protected $perf       = NULL;
    protected $act        = NULL;
    protected $model_obj  = NULL;
    protected $perm       = NULL;
    private   $action_obj = NULL;
    
    //variaveis de estado
    private   $actions    = array();
    private   $permissoes = array();
    private   $perfis     = array();
    private   $erro       = array();
    private   $cod_plugin = "";
    
    public function __construct() {
        //inicializa os objetos a serem usados pela classe
        $this->LoadModel('plugins/model'    , 'model_obj');
        $this->LoadModel('usuario/perfil'   , 'user_perfil');
        $this->LoadModel('plugins/action'   , 'act');
        $this->LoadModel('plugins/permissao', 'perm');
    }
    
    public function register($plugin, $cod_plugin){
        
        //inicializa as variaveis de estado
        $this->init($plugin, $cod_plugin);
        
        //registra as permissoes
        $this->registerPermission();
        
        //registra as acoes encontradas
        $this->registerActions();
        
        //registra os perfis de usuário
        $this->registerPerfis();
        
        //verifica se ocorreu algum erro
        return $this->hasError();
    }
    
    private function registerActions(){
        foreach($this->actions as $url => $arr){
            $this->registerAction($url, $arr);
        }
    }
    
    private function registerAction($url, $arr){
        
        //verifica se a ação já está registrada
        if($this->act->getCount("plugins_action_nome = '$url'") > 0) return;

        //inicializa as variaveis
        $post    = array();
        $act     = explode('/', $url);
        array_pop($act);
        $model   = implode("/", $act);
        $item    = $this->model_obj->getItem($model, 'plugins_model_name', true);
        
        if(empty($item)) { 
            $insert = array(
                'plugins_model_name' => $model, 'plugins_model_label' => "", 
                "plugins_model_description" => "", 'cod_plugin' => $cod_plugin);
            $this->LoadModel('plugins/model', 'tmp_m');
            if(!$this->tmp_m->inserir($insert)){
                $this->erro[] = "O model $model Não foi registrado no banco de dados!<br/>";
                return;
            }else $item['plugins_model_cod'] = $this->tmp_m->getLastId();
        }

        $perm    = $this->perm->getItem($arr['permission'], 'plugins_permissao_nome');
        if(empty($perm)) {$this->erro[] = "A permissão \"".$arr['permission']."\" não foi registrado no banco de dados!<br/>"; return;}

        $this->insertAction($item['plugins_model_cod'], $perm['plugins_permissao_cod'], $url, $arr);
    }

    private function insertAction($cod_model, $cod_perm, $url, $arr){
        
        //verifica se uma ação possui tutorial ou algum tipo de notificação
        if(array_key_exists('notificar', $arr))$post['notificar'] = $arr['notificar'];
        if(array_key_exists('tutorial', $arr)) $post['tutorial']  = $arr['tutorial'];
        
        //seta as variaveis a serem inseridas
        $post['plugins_action_cod']         = "";
        $post['plugins_model_cod']          = $cod_model;
        $post['plugins_action_nome']        = $url;
        $post['plugins_action_label']       = $arr['label'];
        $post['plugins_permissao_cod']      = $cod_perm;
        $post['plugins_action_privacidade'] = (isset($arr['publico']) && $arr['publico'] == "s")?'publico':'privado';
        $post['plugins_action_groupyes']    = (isset($arr['default_yes']))?$arr['default_yes']:"p";
        $post['plugins_action_groupno']     = (isset($arr['default_no'])) ?$arr['default_no'] :"n";
        if(!$this->act->inserir($post))
           $this->erro[] = $this->act->getErrorMessage();
    }
    
    private function registerPerfis(){
        $this->LoadModel('usuario/perfil', 'up');
        $this->LoadModel('plugins/acesso', 'acc' );
        foreach($this->perfis as $perf){
            $insert = array();
            foreach($perf as $key => $val){
                if(is_array($val)) continue;
                $insert["usuario_perfil_$key"] = $val;
            }
            
            $cod_perfil = $perf['cod'];
            $where = "usuario_perfil_nome = '".$perf['nome']."' OR usuario_perfil_cod = '$cod_perfil'";
            if($this->up->getCount($where) == 0) {
                if(!$this->up->inserir($insert))
                    $this->erro[] = $this->up->getErrorMessage();
            }
            
            if(!isset($perf['permissions']) || empty($perf['permissions'])) continue;
            foreach($perf['permissions'] as $permname => $val){
                
                if(is_numeric($permname)){
                    $permname = $val;
                    $val      = 's';
                }
                $cod_perm = $this->perm->getCodPermissionByName($permname);
                if($cod_perm == "") continue;
                
                $add['plugins_acesso_permitir'] = $val;
                $where = "usuario_perfil_cod = '$cod_perfil' AND plugins_permissao_cod = '$cod_perm'";
                if($this->acc->getCount($where) == 0){
                    $add['usuario_perfil_cod']      = $cod_perfil;
                    $add['plugins_permissao_cod']   = $cod_perm;
                    if(!$this->acc->inserir($add)) 
                        $this->erro[] = $this->acc->getErrorMessage();
                }else{
                    if(!$this->acc->editar(array($cod_perm, $cod_perfil), $add))
                       $this->erro[] = $this->acc->getErrorMessage();
                }
            }
        }
    }


    private function init($plugin, $cod_plugin){
        $this->cod_plugin = $cod_plugin;
        $this->action_obj = $this->LoadActionClass($plugin);
        $this->actions    = $this->action_obj->getActions();
        $this->permissoes = $this->action_obj->getPermissions();
        $this->perfis     = $this->action_obj->getPerfis();
    }
    
    private function hasError(){
        if(empty($this->erro)) return true;
        $erro = implode ("<br/>", $this->erro);
        $this->setAlertMessage($erro);
        return false;
    }
        
    private function LoadActionClass($plugin){
        
        //carrega o arquivo
        $file = MODULOS . "$plugin/Config/{$plugin}Actions.php";
        if(!file_exists($file)) {
            throw new modelException(__CLASS__, 
                 "AILAC01 - Arquivo de configuração de ações <br/>$file<br/> não encontrado no plugin $plugin."
            );
        }
        require_once $file;
        
        //carrega a classe
        $class  = "{$plugin}Actions";
        if(!class_exists($class)) {
            throw new modelException(__CLASS__, 
                    "AILAC02 - Classe de ação $class não encontrada no plugin $plugin"
            );
        }
        return new $class();
    }
    
    private function registerPermission(){
        
        $this->LoadClassFromPlugin('admin/install/registerPermissions', 'rp');
        $this->rp->register($this->action_obj, $this->cod_plugin , $this->permissoes);
        
    }
}

?>
